home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Carnage_Contest / scripts / CC Original / weapons / Ice Grenade.lua < prev    next >
Text File  |  2010-08-31  |  7KB  |  191 lines

  1. --------------------------------------------------------------------------------
  2. -- Weapon Ice Grenade + Projectile Ice Grenade
  3. -- Original Carnage Contest Weapon
  4. -- Script by DC, August 2009, www.UnrealSoftware.de
  5. --------------------------------------------------------------------------------
  6.  
  7. -- Setup Tables
  8. if cc==nil then cc={} end
  9. cc.icegrenade={}
  10. cc.icegrenade.icegrenade={}
  11.  
  12. -- Load & Prepare Ressources
  13. cc.icegrenade.gfx_wpn=loadgfx("weapons/icegrenade.bmp")                    -- Weapon Image
  14. setmidhandle(cc.icegrenade.gfx_wpn)
  15. cc.icegrenade.gfx_ice=loadgfx("weapons/ice.bmp")                        -- Impact Ice
  16. cc.icegrenade.sfx_attack=loadsfx("throw.ogg")                            -- Attack Sound
  17. cc.icegrenade.sfx_bounce=loadsfx("bounce.wav")                            -- Bounce Sound
  18. cc.icegrenade.sfx_freeze=loadsfx("freeze.wav")                            -- Freeze Sound
  19.  
  20. --------------------------------------------------------------------------------
  21. -- Weapon: Ice Grenade
  22. --------------------------------------------------------------------------------
  23.  
  24. cc.icegrenade.id=addweapon("cc.icegrenade","Ice Grenade",cc.icegrenade.gfx_wpn,1,2)    -- Add Weapon (1 use, first in round 2)
  25.  
  26. function cc.icegrenade.draw()                                                    -- Draw
  27.     if weapon_shots<=0 then
  28.         setblend(blend_alpha)
  29.         setalpha(1)
  30.         setcolor(255,255,255)
  31.         drawinhand(cc.icegrenade.gfx_wpn,6,0)
  32.     end
  33.     -- HUD chargebar
  34.     if weapon_charge>0 and weapon_shots==0 then
  35.         hudchargebar(weapon_charge,100)
  36.     end
  37.     -- HUD Crosshair / HUD Timer
  38.     if weapon_shots==0 then
  39.         hudcrosshair(4,3)
  40.         hudtimer(3,1,10)
  41.     end
  42. end
  43.  
  44. function cc.icegrenade.attack(attack)                                            -- Attack
  45.     if (weapon_shots<=0) then
  46.         -- Charge
  47.         if (attack==1) then
  48.             weapon_charge=weapon_charge+1                                        -- Increase charge
  49.         end
  50.         -- Fire a projectile (on release/full charge)
  51.         if (attack==0 and weapon_charge>0) or (weapon_charge>=100) then
  52.             -- No more weapon switching!
  53.             useweapon(0)
  54.             playsound(cc.icegrenade.sfx_attack)
  55.             weapon_shots=weapon_shots+1
  56.             id=createprojectile(cc.icegrenade.icegrenade.id)
  57.             projectiles[id]={}
  58.             -- Ignore collision with current player at beginning
  59.             projectiles[id].ignore=playercurrent()
  60.             -- Set initial position of projectile
  61.             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))
  62.             projectiles[id].y=getplayery(0)+3
  63.             -- Initial collision check (avoid throwing into other objects)
  64.             for i=0,10,1 do
  65.                 if collision(col5x5,projectiles[id].x+math.sin(math.rad(getplayerrotation(0)))*i,projectiles[id].y-math.cos(math.rad(getplayerrotation(0)))*i)==1 then
  66.                     if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  67.                         if (i==0) then
  68.                             projectiles[id].x=getplayerx(0)
  69.                             projectiles[id].y=getplayery(0)+3
  70.                             break
  71.                         else
  72.                             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))+math.sin(math.rad(getplayerrotation(0)))*(i-1)
  73.                             projectiles[id].y=getplayery(0)+3-math.cos(math.rad(getplayerrotation(0)))*(i-1)
  74.                             break
  75.                         end
  76.                     end
  77.                 end
  78.             end
  79.             -- Set speed of projectile
  80.             projectiles[id].sx=math.sin(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  81.             projectiles[id].sy=-math.cos(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  82.             -- Set timer
  83.             projectiles[id].timer=weapon_timer*50
  84.             -- Effects
  85.             recoil(2)
  86.             -- End Turn
  87.             endturn()
  88.         end
  89.     end
  90. end
  91.  
  92. --------------------------------------------------------------------------------
  93. -- Projectile: Ice Grenade
  94. --------------------------------------------------------------------------------
  95.  
  96. cc.icegrenade.icegrenade.id=addprojectile("cc.icegrenade.icegrenade")    -- Add Projectile
  97.  
  98. function cc.icegrenade.icegrenade.draw(id)                                -- Draw
  99.     -- Setup draw mode
  100.     setblend(blend_alpha)
  101.     setalpha(1)
  102.     setcolor(255,255,255)
  103.     setscale(1,1)
  104.     -- Calculate projectile rotation
  105.     setrotation(math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy)))
  106.     -- Draw projectile
  107.     drawimage(cc.icegrenade.gfx_wpn,projectiles[id].x,projectiles[id].y)
  108.     -- Draw Arrow if out of Screen
  109.     outofscreenarrow(projectiles[id].x,projectiles[id].y)
  110. end
  111.  
  112. function cc.icegrenade.icegrenade.update(id)                            -- Update
  113.     -- Particle Tail
  114.     particle(p_smoke,projectiles[id].x,projectiles[id].y)
  115.     particlespeed(math.random(-2,2)*0.1,math.random(-2,2)*0.1)
  116.     particlecolor(255,255,255)
  117.     -- Gravity influence on speed
  118.     projectiles[id].sy=projectiles[id].sy+getgravity()
  119.     -- Move (in substep loop for optimal collision precision)
  120.     msubt=math.ceil(math.max(math.abs(projectiles[id].sx),math.abs(projectiles[id].sy))/3)
  121.     msubx=projectiles[id].sx/msubt
  122.     msuby=projectiles[id].sy/msubt
  123.     for i=1,msubt,1 do
  124.         -- Move X
  125.         projectiles[id].x=projectiles[id].x+msubx
  126.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  127.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  128.                 if (math.abs(projectiles[id].sx)>0.5) then playsound(cc.icegrenade.sfx_bounce) end
  129.                 projectiles[id].x=projectiles[id].x-msubx
  130.                 projectiles[id].sx=-projectiles[id].sx*0.3
  131.                 msubx=-msubx*0.3
  132.             end
  133.         else
  134.             projectiles[id].ignore=0
  135.         end
  136.         -- Move Y
  137.         projectiles[id].y=projectiles[id].y+msuby
  138.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  139.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  140.                 if (math.abs(projectiles[id].sy)>0.5) then playsound(cc.icegrenade.sfx_bounce) end
  141.                 projectiles[id].y=projectiles[id].y-msuby
  142.                 projectiles[id].sy=-projectiles[id].sy*0.3
  143.                 msuby=-msuby*0.3
  144.                 projectiles[id].sx=projectiles[id].sx*0.9
  145.                 msubx=msubx*0.9
  146.             end
  147.         else
  148.             projectiles[id].ignore=0
  149.         end        
  150.         -- Water
  151.         if (projectiles[id].y)>getwatery()-45 then
  152.             projectiles[id].timer=0
  153.             break
  154.         end
  155.     end
  156.     -- Timer -> Explode
  157.     projectiles[id].timer=projectiles[id].timer-1
  158.     if projectiles[id].timer<=0 then
  159.         playsound(cc.icegrenade.sfx_freeze)
  160.         -- Crater
  161.         blue=math.random(200,255)
  162.         if math.random(0,1)==1 then
  163.             terrainalphaimage(gfx_crater100,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,blue,blue,255)
  164.         else
  165.             terrainalphaimage(gfx_crater125,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,blue,blue,255)
  166.         end
  167.         -- Ice
  168.         terrainimage(cc.icegrenade.gfx_ice,projectiles[id].x,projectiles[id].y)
  169.         -- Freeze Players
  170.         players=playertable()
  171.         for i=1,#players,1 do
  172.             if getplayerhealth(players[i])>0 then
  173.                 if math.sqrt((getplayerx(players[i])-projectiles[id].x)^2+(getplayery(players[i])-projectiles[id].y)^2)<=45 then
  174.                     playerstate(players[i],state_frozen,1)
  175.                 end
  176.             end
  177.         end
  178.         -- Particles
  179.         particle(p_muzzle,projectiles[id].x,projectiles[id].y)
  180.         particlecolor(255,255,255)
  181.         for angle=0,350,10 do
  182.             particle(p_smoke,projectiles[id].x,projectiles[id].y)
  183.             particlespeed(math.sin(math.rad(angle))*2,-math.cos(math.rad(angle))*2)
  184.             particlecolor(255,255,255)
  185.         end
  186.         -- Free projectile
  187.         freeprojectile(id)
  188.     end
  189.     -- Scroll to projectile
  190.     scroll(projectiles[id].x,projectiles[id].y)
  191. end